﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ext.Net;
using Ent.Inscripcion.Core.Core;
using Ent.Inscripcion.Core;
using System.Configuration;
using Ent.Inscripcion.Core.Administracion;

namespace Ent.Inscripcion.Presentacion
{
    public partial class SolicitarExamen : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!X.IsAjaxRequest)
                {
                    int diasAntesReg;
                    int.TryParse(ConfigurationManager.AppSettings.Get("DiasAntesRegistro"), out diasAntesReg);
                    dtfFecha.SelectedDate = (DateTime.Now.AddDays(diasAntesReg));
                    dtfFecha.MinDate = DateTime.Now.AddDays(diasAntesReg);
                    ////Carga de horarioExamens de dias
                    stoDias.DataSource = DiaLista.GetLista("DIAS");
                    stoDias.DataBind();
                    //Carga de horarioExamens de Niveles
                    stoNiveles.DataSource = CatalogoItemLista.GetListaCatalogos("NIVEL");
                    stoNiveles.DataBind();
                    //Carga de solicitudes
                    var estudiante = Session["Estudiante"] as Estudiante;
                    CargarSolicitudesExamenes(estudiante.Id.ToString());
                }
            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex.ToString());
            }
        }
        protected void btnCrearExamen_Click(object sender, DirectEventArgs e)
        {
            try
            {
                controlVerificaPago.Mostrar(2);
                e.Success = true;
            }
            catch (Exception ex)
            {
                
                e.Success = false;
                Util.RegistarLog(ex);
            }
        }
        protected void btnBuscar_Click(object sender, DirectEventArgs e)
        {
            try
            {
                DateTime fecha;
                DateTime.TryParse(e.ExtraParams["Dia"], out fecha);
                var criterioHorario = HorarioExamenCriterio.NewHorarioExamenCriterio();
                criterioHorario.DiaId = ((int)fecha.DayOfWeek).ToString();
                criterioHorario.NivelId = e.ExtraParams["Nivel"];

                CargarDatos(criterioHorario);
                e.Success = true;
            }
            catch (Exception ex)
            {
                e.Success = false;
                Util.RegistarLog(ex.ToString());
            }
        }

        protected void ManejarAccion(object sender, DirectEventArgs e)
        {
            try
            {
                DateTime fecha;
                DateTime.TryParse(e.ExtraParams["Fecha"], out fecha);

                Guid idHorarioExamen = Guid.Parse(e.ExtraParams["Id"]);
                string opcion = e.ExtraParams["Comando"];
                var horarioExamen = HorarioExamen.GetHorarioExamen(idHorarioExamen);
                hidDia.SetValue(e.ExtraParams["Dia"]);
                hidNivel.SetValue(e.ExtraParams["Nivel"]);
                DatosHorarioExamen(horarioExamen, e.ExtraParams["Nivel"]);

                var verificaCupos = VerificarHorarioExamenCmd.Execute(e.ExtraParams["Id"], fecha);
                                
                e.ExtraParamsResponse["ErrorCupo"] = verificaCupos.Result?"0":"1";
                e.Success = true;
            }
            catch (Exception ex)
            {
                
                e.Success = false;
                Util.RegistarLog(ex.ToString());
            }
        }

        private void DatosHorarioExamen(HorarioExamen horarioExamen,String Nivel)
        {
            cbxDiaS.SetValue(horarioExamen.DiaId);
            cbxNivelS.SetValue(Nivel);
            tfHoraInicio.SetValue(horarioExamen.HoraInicio);
            tfHoraFin.SetValue(horarioExamen.HoraFin);
            hidIdExamen.Text = horarioExamen.Id.ToString();
        }

        protected void btnGuardar_Click(object sender, DirectEventArgs e)
        {
            int aux = 0;
            try
            {
                var id = e.ExtraParams["Id"];
                var idHorario = e.ExtraParams["IdHorario"];
                var accion = e.ExtraParams["Accion"];
                var nivel = e.ExtraParams["NivelId"];
                DateTime fecha;
                DateTime.TryParse(e.ExtraParams["Fecha"], out fecha);

                RegistroExamen registroExamen = null;

                registroExamen = accion == "Nuevo" ? RegistroExamen.NewRegistroExamen() : RegistroExamen.GetRegistroExamen(Guid.Parse(id));

                var estudiante = Session["Estudiante"] as Estudiante;
                var infoFactura = Session["InfoFactura"] as InfoFactura;
                var horario = HorarioExamen.GetHorarioExamen(Guid.Parse(idHorario));
                registroExamen.DiaId = horario.DiaId;
                registroExamen.EstudianteId = estudiante.Id.ToString();
                registroExamen.Fecha = fecha;
                registroExamen.Hora = horario.HoraInicio;
                registroExamen.HorarioId = horario.Id.ToString();
                registroExamen.NivelId = nivel;
                if (accion == "Nuevo")
                {
                    registroExamen.NumeroFactura = infoFactura.NumeroFactura;
                    registroExamen.Item = infoFactura.Item;
                    registroExamen.Identificacion = infoFactura.Identificacion;
                    registroExamen.FechaPago = infoFactura.Fecha;
                }

                var verificaCupos = VerificarHorarioExamenCmd.Execute(horario.Id.ToString(), fecha);

                e.ExtraParamsResponse["ErrorCupo"] = verificaCupos.Result ? "0" : "1";
                e.Success = true;
                if (verificaCupos.Result)
                {
                    registroExamen = registroExamen.Save();
                    if (registroExamen.Resp == 0)
                    {
                        e.ExtraParamsResponse["ErrorCupo"] = "1";
                    }
                    else
                    {
                        aux = 1;
                        EnviarMail(e, estudiante);
                        CargarSolicitudesExamenes(estudiante.Id.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                if (aux == 0)
                {
                    e.Success = false;
                }
                Util.RegistarLog(ex.ToString());
            }
        }

        private void EnviarMail(DirectEventArgs e, Estudiante estudiante)
        {
            try
            {
                //Estimado estudiante el horario para rendir el exámen del nivel {0} es el {1} {2} a las {3}
                var cuerpoMensaje = string.Format(ManejadorRecursos.GetRecurso("MensajeInsExamen"), e.ExtraParams["Nivel"], e.ExtraParams["Dia"], e.ExtraParams["Fecha"], e.ExtraParams["HoraInicio"]);
                var envioEmail = new EnvioEmail();
                envioEmail.EnviarEmail(estudiante.Email, "Horario Examen", cuerpoMensaje);
            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex.ToString());
            }
        }

        /// <summary>
        /// Permite editar el examen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gdpSolExamenes_Command(object sender, DirectEventArgs e)
        {
            try
            {
                var id = e.ExtraParams["Id"];
                var verificaCambio = VerificarCambioExamenCmd.Execute(id);
                int numCambios;
                int.TryParse(ConfigurationManager.AppSettings.Get("NumCambios"), out numCambios);
                
                if (verificaCambio.Result >= numCambios)
                {
                    e.ExtraParamsResponse["Opcion"] = "0";
                    e.ExtraParamsResponse["Mensaje"] = ManejadorRecursos.GetRecurso("NumeroCambiosExamen"); ;
                }
                else
                {
                    e.ExtraParamsResponse["Opcion"] = "1";
                    hidIdSolicitud.Text = id;
                    var registroExamen = RegistroExamen.GetRegistroExamen(Guid.Parse(id));
                    int numDiasCambios;
                    int.TryParse(ConfigurationManager.AppSettings.Get("DiasAntesCambios"), out numDiasCambios);
                    if (DateTime.Now.AddDays(numDiasCambios).CompareTo(registroExamen.Fecha)>0)
                    {
                        e.ExtraParamsResponse["Opcion"] = "0";
                        e.ExtraParamsResponse["Mensaje"] =string.Format(ManejadorRecursos.GetRecurso("DiasAntesCambio"),numDiasCambios);
                    }
                    var horarioExamen = HorarioExamen.GetHorarioExamen(Guid.Parse(registroExamen.HorarioId));
                    DatosHorarioExamen(horarioExamen, registroExamen.NivelId);
                    cbxNivelB.SetValue(registroExamen.NivelId);

                }
            }
            catch (Exception ex)
            {
                e.Success = false;
                Util.RegistarLog(ex);
            }
        }
        private void CargarDatos(HorarioExamenCriterio criterio)
        {
            stoExamenes.DataSource = HorarioExamenLista.GetHorarioExamenLista(criterio);
            stoExamenes.DataBind();
        }

        void CargarSolicitudesExamenes(string id)
        {
            try
            {
                var listaSolicitudes = RegistroExamenLista.GetRegistroExamenLista(id);
                stoSolExamenes.DataSource = listaSolicitudes;
                stoSolExamenes.DataBind();
            }
            catch (Exception)
            {
                   
            }
            
        }
    }
}